import dayjs from 'dayjs'
import relativeTime from 'dayjs/plugin/relativeTime'
import duration from 'dayjs/plugin/duration'
import localizedFormat from 'dayjs/plugin/localizedFormat'
import isSameOrAfter from 'dayjs/plugin/isSameOrAfter'
import isSameOrBefore from 'dayjs/plugin/isSameOrBefore'
import customParseFormat from 'dayjs/plugin/customParseFormat'
import 'dayjs/locale/zh-cn'

// 加载插件
dayjs.extend(relativeTime)
dayjs.extend(duration)
dayjs.extend(localizedFormat)
dayjs.extend(isSameOrAfter)
dayjs.extend(isSameOrBefore)
dayjs.extend(customParseFormat)
dayjs.locale('zh-cn')

/**
 * 获取当前时间
 * @returns {string} 当前时间字符串
 * @example getNow() => '2025-05-19 14:35:22'
 */
export function getNow() {
  return dayjs().format('YYYY-MM-DD HH:mm:ss')
}

/**
 * 格式化时间
 * @param {string|Date|number} time 时间输入
 * @param {string} format 格式，默认 'YYYY-MM-DD HH:mm:ss'
 * @returns {string} 格式化后的时间
 * @example formatTime('2025-05-19T10:00:00', 'YYYY年MM月DD日 HH:mm') => '2025年05月19日 10:00'
 */
export function formatTime(time, format = 'YYYY-MM-DD HH:mm:ss') {
  return dayjs(time).isValid() ? dayjs(time).format(format) : ''
}

/**
 * 计算相对时间（多久以前）
 * @param {string|Date|number} time 输入时间
 * @returns {string} 如“3小时前”、“1天前”
 * @example fromNow('2025-05-18T15:00:00') => '23小时前'
 */
export function fromNow(time) {
  return dayjs(time).isValid() ? dayjs(time).fromNow() : ''
}

/**
 * 判断时间是否在某个时间之后
 * @param {string|Date|number} timeA 比较时间 A
 * @param {string|Date|number} timeB 比较时间 B（默认当前时间）
 * @returns {boolean}
 * @example isAfter('2025-05-20', '2025-05-19') => true
 */
export function isAfter(timeA, timeB = dayjs()) {
  return dayjs(timeA).isValid() && dayjs(timeB).isValid()
    ? dayjs(timeA).isAfter(dayjs(timeB))
    : false
}

/**
 * 判断时间是否在某个时间之前
 * @param {string|Date|number} timeA
 * @param {string|Date|number} timeB
 * @returns {boolean}
 * @example isBefore('2025-05-18', '2025-05-19') => true
 */
export function isBefore(timeA, timeB = dayjs()) {
  return dayjs(timeA).isValid() && dayjs(timeB).isValid()
    ? dayjs(timeA).isBefore(dayjs(timeB))
    : false
}

/**
 * 获取两个时间之间的持续时间（返回 dayjs duration 对象）
 * @param {string|Date|number} start 开始时间
 * @param {string|Date|number} end 结束时间（默认现在）
 * @returns {object} duration 对象，可使用 duration.as('minutes') 等方法
 * @example getDuration('2025-05-18 10:00', '2025-05-18 12:30') => { hours: 2, minutes: 30, ... }
 */
export function getDuration(start, end = dayjs()) {
  return dayjs(start).isValid() && dayjs(end).isValid()
    ? dayjs.duration(dayjs(end).diff(dayjs(start)))
    : dayjs.duration(0)
}

/**
 * 获取两个时间之间的具体差距（人类可读）
 * @param {string|Date|number} start
 * @param {string|Date|number} end
 * @returns {string} 如“2小时 15分钟 30秒”
 * @example getDurationText('2025-05-18 10:00', '2025-05-18 12:16:30') => '2小时 16分钟 30秒'
 */
export function getDurationText(start, end = dayjs()) {
  const d = getDuration(start, end)
  const hours = d.hours()
  const minutes = d.minutes()
  const seconds = d.seconds()
  return `${hours}小时 ${minutes}分钟 ${seconds}秒`
}
